Matering Ethereum2章 Ethereum Basic
ウォレットの使い方
トランザクションの作り方
スマートコントラクトベーシック
Etherの最小単位はwei
$ 1ETH = 10^{18}
Ethereumはシステムの名前、Etherは通貨の単位の名前
Ethereum内でのやり取りはweiで表現される。
Ethereumの単位
https://gyazo.com/7dff0537a32efd3e09444430c04d4244
Ethereumのウォレットを選ぶ
"wallet"の定義
A software application that helps you manage your Ethereum account. In short, an Ethereum wallet is your gateway to the Ethereum system.
ウォレットには3種類ある
Mobile wallet
Desktop wallet
Web-based wallet.
いくつかのウォレット
MetaMask
Jaxx
MyEtherWallet (MEW)
Emerald Wallet
コントロールとレスポンシビリティー
fundとスマコンへ個人がアクセスするためにプライベートキーは個人で管理しなければならない。実際はCEXが管理している場合もあるので、原本ではCan、もしくはShouldとなっている。
プライベートキーをマネージするためのtips
セキュリティに妥協しない
プライベートキーを生の形(英数字)で管理しない
プライベートキーは"keystore"ファイルに暗号化された形で保存されている。復号化するにはパスワードが必要。アカウントにアクセスするためにはkeystoreとpasswordが必要
オンライン上にプライベートキーを管理するな
mnemonic wordの管理はオフラインで行え
いきなり大きな額を動かすのではなくテストで少額で動かせ
Metamskを始める
Google Chromeにアクセス:https://chrome.google.com/webstore/category/extensions
Metamaskをサーチ
スキャムに気をつけてインストール
名前とパスワードを入力すると12単語のニーモニックがでてくる
ネットワーク
Main Ethereum Network
Ropsten Test Network
Kovan Test Network
Auraコンセンサスプロトコル
PoA
Parityのみ対応
Rinkeby Test Network
Cliqueコンセンサスプロトコル
PoA
Localhost 8545
同じローカルホストに接続されているPCと接続する
パブリックでもプライベートでも良い
Custom RPC
Geth-compatible Remote Procedure Call (RPC) によってMetamaskからノードに接続できる
パブリックでもプライベートでも可
アドレスの取得、RopstenでEther獲得
Explorerで確認:https://etherscan.io/
ベーシックなgas unitは21,000 gas
アベレージのgas priceが3gweiの場合
手数料でかかるのは、3*21,000gwei = 63,000gwei = 0.000063ETH
World Computerとは?
Etherは確かに通貨だが、通貨以上にEthereum Virtual Machine (EVM)の役割の方が大事。
EVMは到るところで動いているがあたかも1つのように見えるワールドコンピューター。Ethereumネットワークの各ノードでEVMのローカルコピーが動いている。
EOAとCA
EthereuネットワークにはExternally Owned AccountとContract Accountがある。EOAはプライベートキーによって管理されている。CAはスマートコントラクト。EVM上で実行されている。コントラクトにはアドレスがあり、送受信がEOAと同様にできる。CAが呼び出された時、EVM上で実行される。
EOAのみがトランザクションの始発点となることができるが、よびだされたCAがCAを呼ぶことはできる。
シンプルなコントラクトを書く
code:javascript
// Our first contract is a faucet!
contract Faucet {
// Give out ether to anyone who asks
function withdraw(uint withdraw_amount) public {
// Limit withdrawal amount
require(withdraw_amount <= 100000000000000000);
// Send the amount to the address that requested it
msg.sender.transfer(withdraw_amount);
}
// Accept any incoming amount
function () public payable {}
}
修飾子publicは他のコントラクトからも呼び出せるという意味。
requireは()内の条件が正しいときのみそれ以下のコントラクトをお実行する。引数の数字はweiで表記する。
code:javascript
function () public payable {}
コントラクト内で名無しデータなしのデフォルトファンクションを持つことができる。通常はetherを受け付けるファンクション。このコントラクトはetherを受けとれますよという意味。etherを受け付ける以外には特に意味はない。
コンパイラー
Remixで行う
https://remix.ethereum.org/#optimize=false
上記のコントラクトを写経。たぶん、pragma solidity ^0.4.19そのままコピペだとエラーがでる。
コンパイラーを指定しなければいけない。0.4.19以上にする。
PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1
REVERT JUMPDEST PUSH1 0xE5 DUP1 PUSH2 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN
STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI
PUSH1 0x0 CALLDATALOAD PUSH29
0x100000000000000000000000000000000000000000000000000000000
SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x2E1A7D4D EQ PUSH1 0x41 JUMPI
JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT
JUMPDEST PUSH1 0x5F PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1
SWAP2 SWAP1 POP POP PUSH1 0x61 JUMP JUMPDEST STOP JUMPDEST PUSH8
0x16345785D8A0000 DUP2 GT ISZERO ISZERO ISZERO PUSH1 0x77 JUMPI PUSH1 0x0 DUP1
REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND
PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1
0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO
ISZERO PUSH1 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP STOP LOG1 PUSH6
0x627A7A723058 KECCAK256 PUSH9 0x13D1EA839A4438EF75 GASLIMIT CALLVALUE LOG4 0x5f
PUSH24 0x7541F409787592C988A079407FB28B4AD000290000000000
→バイトコードはこんな感じ。
実際にbyteコードをブロックチェーンに登録する際には、特別なトランザクションを創り出す。トランザクションの送信先は
0x0000000000000000000000000000000000000000、これはゼロアドレスと呼ばれている。Remix IDE内でこの手続はでき、Metamaskにトランザクションをお送る。
実行手順
Runタブに切り替える
Inject Web3に設定
こうすることでMetamaskのアドレスが勝手に反映される
Deploy
Metamaskでsubmit(Metamaskでトランザクションを創り出す許可)
15秒くらいまつ
実際のところ、Faucetのアカウントにまずdeposit金を入れなければいけない。なのでこのコントラクトに対して送金を行う。
コントラクトに対して送金を行えるのはfunction () public payable {}が効いているから。送金トランザクションがEVM上でコントラクトの実行を促しbalanceをアップデートする。これによってFaucet.solにdepositできた。
EtherscanのInternal Transactionでdepositの内容確認ができる。
Soource: https://github.com/ethereumbook/ethereumbook/blob/develop/02intro.asciidoc